import fs from 'node:fs';
import chokidar from 'chokidar';
import path from 'node:path';
if (!global.segment) {
  global.segment = (await import("oicq")).segment;
}

// 使用 ANSI 转义序列设置文本颜色
logger.info('\x1b[34m---------加载插件中---------\x1b[0m');

logger.info('\x1b[34m瑜笙大佬别骂！！我只会cv不会添加关于开源许可一大堆\x1b[0m');
async function createConfigFolder() {
  const configFolderPath = path.resolve('./plugins/HIT-plugin/config');
  const defConfigFolderPath = './plugins/HIT-plugin/def_config';

  let msg;

  try {
    // 检查config文件夹是否存在
    const configExists = await fs.promises.stat(configFolderPath).catch(() => null);

    if (configExists) {
      // 配置文件夹已存在
      msg = '配置文件已存在';
    } else {
      // 如果不存在则创建
      await fs.promises.mkdir(configFolderPath, { recursive: true });

      // 获取def_config文件夹下的所有文件
      const files = await fs.promises.readdir(defConfigFolderPath);

      // 遍历文件并复制到config文件夹
      await Promise.all(files.map(async (file) => {
        const sourcePath = path.join(defConfigFolderPath, file);
        const destPath = path.join(configFolderPath, file);

        // 复制文件
        await fs.promises.copyFile(sourcePath, destPath);
      }));

      msg = '复制配置文件完成';
    }
  } catch (error) {
    msg = '创建和复制配置文件夹时出错：' + error.message;
    logger.error(msg);
  }

  logger.info(msg);
}


createConfigFolder();
async function loadPlugins() {
  const files = fs.readdirSync('./plugins/HIT-plugin/apps').filter(file => file.endsWith('.js'));

  let ret = files.map(file => import(`./apps/${file}`));
  ret = await Promise.allSettled(ret);

  let apps = {};
  for (let i in files) {
    const name = files[i].replace('.js', '');
    if (ret[i].status !== 'fulfilled') {
      logger.error(`\x1b[31m载入插件错误：${name}\x1b[0m`);
      logger.error(ret[i].reason);
      continue;
    }
    apps[name] = ret[i].value[Object.keys(ret[i].value)[0]];
  }
  return apps;
}

logger.info('\x1b[34m---------哼哼啊啊啊---------\x1b[0m'); // 蓝色
logger.info('\x1b[33mInfo\n' +
'////////////////////////////////////////////////////////////////////\n' +
'//                          _ooOoo_                               //\n' +
'//                         o8888888o                              //\n' +
'//                         88" . "88                              //\n' +
'//                         (| ^_^ |)                              //\n' +
'//                         O\\  =  /O                              //\n' +
'//                      ____/`---\'\\____                           //\n' +
'//                    .\'  \\\\|     |//  `.                         //\n' +
'//                   /  \\\\|||  :  |||//  \\                        //\n' +
'//                  /  _||||| -:- |||||-  \\                       //\n' +
'//                  |   | \\\  -  /// |   |                       //\n' +
'//                  | \\_|  \'\'\\---/\'\'  |   |                       //\n' +
'//                  \\  .-\\__  `-`  ___/-. /                       //\n' +
'//                ___`. .\'  /--.--\\  `. . ___                     //\n' +
'//              ."" \'<  `.___\\_<|>_/___.\'  >\'"".                  //\n' +
'//            | | :  `-\`\\.;`\\ _ /`;.`/ - ` : | |                 //\n' +
'//            \\  \\ `-.   \\_ __\\ /__ _/   .-` /  /                 //\n' +
'//      ========`-.____`-.___\\_____/___.-`____.-\'========         //\n' +
'//                           `=---=\'                              //\n' +
'//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        //\n' +
'//         佛祖保佑       永无BUG     永不修改                  //\n' +
'////////////////////////////////////////////////////////////////////\n' +
'\x1b[0m');


export let apps = await loadPlugins();

// 记录已加载的插件
const loadedPlugins = new Set(Object.keys(apps));

for (const name of Object.keys(apps)) {
  logger.info(`\x1b[33m加载插件中：${name}\x1b[0m`); // 橙色
  logger.info(`\x1b[33m加载完成\x1b[0m`);
}

// 监听文件变化并进行热更新
// 监听文件变化并进行热更新
// 监听文件变化并进行热更新
const watcher = chokidar.watch('./plugins/HIT-plugin/apps/**/*.js', { ignoreInitial: false });
watcher.on('all', async (event, path) => {
  logger.info(`\x1b[33m检测到插件变化 (${event}): ${path}, 进行热更新...\x1b[0m`);
  try {
    // 重新加载插件
    const newApps = await loadPlugins();

    // 查找新增的插件
    const newPluginNames = Object.keys(newApps).filter(name => !loadedPlugins.has(name));
    if (newPluginNames.length > 0) {
      logger.info(`\x1b[33m发现新插件：${newPluginNames.join(', ')}\x1b[0m`);
    }

    // 查找删除的插件
    const deletedPluginNames = Array.from(loadedPlugins).filter(name => !newApps.hasOwnProperty(name));
    if (deletedPluginNames.length > 0) {
      logger.info(`\x1b[33m发现删除的插件：${deletedPluginNames.join(', ')}\x1b[0m`);
    }

    // 更新全局变量
    apps = newApps;
    loadedPlugins.clear();
    loadedPlugins.add(...Object.keys(apps));

    logger.info('\x1b[33m热更新完成！\x1b[0m'); // 橙色
  } catch (error) {
    logger.error('\x1b[31m热更新失败！\x1b[0m'); // 红色
    logger.error(error);
  }
});
